package com.bw.i_video

import android.app.Application
import android.content.Context
import android.os.SystemClock
import android.util.Log
import com.bw.i_video.startup.StartupManager
import com.bw.i_video.startup.StartupConfig
import com.bw.i_video.startup.StartupOptimizationManager
import com.bw.i_video.startup.StartupUtils
import com.bw.i_video.startup.tasks.DatabaseInitTask
import com.bw.i_video.startup.tasks.ImageLoaderInitTask
import com.bw.i_video.startup.tasks.NetworkInitTask
import com.bw.i_video.startup.tasks.RouterInitTask
import com.example.common.base.BaseApp
import com.tencent.mmkv.MMKV
import com.therouter.TheRouter
import dagger.hilt.android.HiltAndroidApp
import me.jessyan.autosize.AutoSize
import me.jessyan.autosize.AutoSizeConfig

@HiltAndroidApp
class App: BaseApp() {
    
    companion object {
        private const val TAG = "App"
    }
    
    private var appStartTime = 0L
    
    override fun attachBaseContext(base: Context?) {
        appStartTime = SystemClock.elapsedRealtime()
        Log.d(TAG, "App attachBaseContext 开始")
        
        TheRouter.isDebug = true or false
        super.attachBaseContext(base)
        
        Log.d(TAG, "App attachBaseContext 完成")
    }

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "App onCreate 开始")
        
        // 初始化启动优化配置
        StartupConfig.init(this)
        
        // 执行全局冷启动优化
        executeGlobalStartupOptimization()
        
        // 初始化 MMKV
        MMKV.initialize(this)
        Log.d(TAG, "MMKV 初始化完成")

        // 初始化 AutoSize
        AutoSize.initCompatMultiProcess(this) // 多进程支持
        AutoSizeConfig.getInstance()
            .setBaseOnWidth(true) // 以宽度为基准适配
            .setExcludeFontScale(true) // 忽略系统字体缩放
        Log.d(TAG, "AutoSize 初始化完成")
        
        val totalTime = SystemClock.elapsedRealtime() - appStartTime
        Log.d(TAG, "App 初始化完成，总耗时: ${totalTime}ms")
    }
    
    /**
     * 执行全局冷启动优化
     * 在应用启动的最早期执行，确保所有组件都能享受优化效果
     */
    private fun executeGlobalStartupOptimization() {
        if (!StartupConfig.isStartupOptimizationEnabled()) {
            Log.d(TAG, "启动优化已禁用")
            // 即使优化被禁用，也要通知启动完成
            notifyStartupOptimizationComplete(0, 0, true)
            return
        }
        
        Log.d(TAG, "开始执行全局冷启动优化")
        
        // 获取设备性能策略
        val strategy = StartupUtils.adjustStartupStrategy(this)
        Log.d(TAG, "设备性能策略: $strategy")
        
        // 配置并执行启动优化任务
        StartupManager.getInstance()
            .addTask(NetworkInitTask())
            .addTask(ImageLoaderInitTask())
            .addTask(RouterInitTask())
            .addTask(DatabaseInitTask())
            .executeStartup(this) {
                val optimizationTime = SystemClock.elapsedRealtime() - appStartTime
                Log.d(TAG, "全局冷启动优化完成，耗时: ${optimizationTime}ms")
                
                // 记录启动性能指标
                StartupUtils.recordStartupMetrics(this, optimizationTime)
                StartupConfig.recordStartupTime(optimizationTime)
                
                // 通知启动优化完成
                notifyStartupOptimizationComplete(optimizationTime, 4, true)
            }
    }
    
    /**
     * 通知启动优化完成
     * 通过StartupOptimizationManager通知SplashScreenActivity开始倒计时
     */
    private fun notifyStartupOptimizationComplete(optimizationTime: Long, taskCount: Int, isSuccess: Boolean) {
        try {
            // 使用StartupOptimizationManager通知启动优化完成
            StartupOptimizationManager.notifyOptimizationComplete(optimizationTime, taskCount, isSuccess)
            
            Log.d(TAG, "已通知启动优化完成: 耗时${optimizationTime}ms, 任务数${taskCount}, 成功${isSuccess}")
        } catch (e: Exception) {
            Log.e(TAG, "通知启动优化完成失败", e)
        }
    }
}